<?php
namespace Monkey;

/**
 * 主题管理器类\Monkey\ThemeManager
 * @package    Monkey
 * @author     HuangYi
 * @copyright  Copyright (c) 2011-07-01——2013-03-30
 * @license    New BSD License
 * @version    $Id: \Monkey\ThemeManager.php 版本号 2013-03-30 $
 */

class ThemeManager
{
    private $_allThemes;
    private $_defaultTheme;
    private $_userTheme;

    private static $_cookieKeyOfTheme='MonkeyTheme';
    private static $_instance;

    private function __construct()
    {
        $this->_allThemes=oApp()->allThemesSet;
        $this->_defaultTheme=oApp()->defaultThemeSet;
        $this->_userTheme=$this->_getUserTheme();
    }

    /**
     * 获取主题管理器单例
     * @return \Monkey\ThemeManager
     */
    public static function _instance()
    {
        !self::$_instance and self::$_instance=new self();
        return self::$_instance;
    }

    /**
     * 获取所有主题名列表
     * @return string 结果等价于oApp()->defaultThemeSet;
     */
    public function getAllThemes()
    {
        return $this->_allThemes;
    }

    /**
     * 获取默认的主题名
     * @return string 结果等价于oApp()->allThemesSet;
     */
    public function getDefaultTheme()
    {
        return $this->_defaultTheme;
    }

    /**
     * 返回当前用户选择的主题
     * @return string
     */
    public function getUserTheme()
    {
        return $this->_userTheme;
    }
    /**
     * 获取当前用户选择的主题
     * @return string
     */
    private function _getUserTheme()
    {
        if(isset($_COOKIE[self::$_cookieKeyOfTheme]))
            return $_COOKIE[self::$_cookieKeyOfTheme];
        else
            return $this->_defaultTheme;
    }

    /**
     * 设置用户选择的主题
     * @param string $theme 主题名
     * @return \Monkey\ThemeManager
     */
    public function setUserTheme($theme)
    {
        $this->_userTheme=$theme;
        setcookie(self::$_cookieKeyOfTheme,$theme,TIME+60*60*24*30);
        return $this;
    }


    /**
     * 获取用于Html的资源文件
     * @param string $subDir= common | front | admin 分别代表公共、前台、后台
     * @param string $type= js | css | image
     * @param string $filename 文件名，含扩展名
     * @return string 优秀返回当前主题中的资源路径，失败后返回默认主题中的资源路径，最后失败了则返回空字符串。
     */
    public function getResourceForHtml($subDir, $type, $filename)
    {
        $sub='/'.$subDir;
        $file='/'.$type.'/'.$filename;
        if($type=='js' || $subDir=='common' ){
            if(file_exists(STATICS.$sub.$file))return __STATICS__.$sub.$file;
        }else{
            if(file_exists(STATICS.$sub.'/'.$this->_userTheme.$file))
                return __STATICS__.$sub.'/'.$this->_userTheme.$file;
            if(file_exists(STATICS.$sub.'/default'.$file))
                return __STATICS__.$sub.'/default'.$file;
        }
        return '';
    }

    /**
     * 构造资源文件的路径
     * @param string $subDir= common | front | admin 分别代表公共、前台、后台
     * @param string $type= js | css | image
     * @param string $filename 文件名，含扩展名
     * @param string $theme  主题名
     * @param bool $isForHtml=false 生成路径是否用于Html
     * @return string
     */
    public function buildPathOfResource($subDir, $type, $filename, $theme, $isForHtml=false)
    {
        $dir=$this->getDirOfResource($subDir,$type,$theme,$isForHtml);
        $pathinfo = pathinfo($filename);
        return $dir.'/'.$pathinfo['basename'];
    }

    /**
     * 获取资源文件目录
     * @param string $subDir= common | front | admin 分别代表公共、前台、后台
     * @param string $type= js | css | image
     * @param string $theme=null  主题名，默认为当前主题名
     * @param bool $isForHtml=true 生成路径是否用于Html
     * @return string
     */
    public function getDirOfResource($subDir, $type, $theme=null, $isForHtml=true)
    {
        if($type=='js' || $subDir=='common' ) $theme='';
        elseif(!$theme) $theme='/'.$this->_userTheme;
        else $theme='/'.$theme;
        if($isForHtml)return __STATICS__.'/'.$subDir.$theme.'/'.$type;
        else return STATICS.'/'.$subDir.$theme.'/'.$type;
    }

    /**
     * 安装资源文件
     * @param string $subDir= common | front | admin 分别代表公共、前台、后台
     * @param string $type= js | css | image
     * @param string $sourceFile 源文件
     * @param string $theme=null  主题名
     * @return bool
     */
    public function installResource($subDir, $type, $sourceFile, $theme)
    {
        $saveFile=$this->buildPathOfResource($subDir,$type,$sourceFile,$theme,false);
        if(file_exists($saveFile))return false;
        return copy($sourceFile,$saveFile);
    }

    /**
     * 卸载资源文件
     * @param string $subDir= common | front | admin 分别代表公共、前台、后台
     * @param string $type= js | css | image
     * @param string $file 目标文件名
     * @param string $theme=null  主题名
     * @return bool
     */
    public function uninstallResource($subDir, $type, $file, $theme)
    {
        $saveFile=$this->buildPathOfResource($subDir,$type,$file,$theme,false);
        if(!file_exists($saveFile))return true;
        return unlink($saveFile);
    }

}